use std::fmt;

// RTSP 模块常量
pub mod rtsp_method {
    // 服务器支持的方法列表
    pub const OPTIONS: &str = "OPTIONS";
    // 媒体流的描述信息
    pub const DESCRIBE: &str = "DESCRIBE";
    // 客户端向服务器宣布媒体流的描述信息
    pub const ANNOUNCE: &str = "ANNOUNCE";
    // 建立媒体流的传输通道，指定传输协议和端口等信息
    pub const SETUP: &str = "SETUP";
    // 请求服务器开始发送媒体流
    pub const PLAY: &str = "PLAY";
    // 暂停媒体流的传输
    pub const PAUSE: &str = "PAUSE";
    // 终止媒体流的传输会话
    pub const TEARDOWN: &str = "TEARDOWN";
    // 获取服务器的特定参数信息
    pub const GET_PARAMETER: &str = "GET_PARAMETER";
    // 设置服务器的特定参数信息
    pub const SET_PARAMETER: &str = "SET_PARAMETER";
    // 服务器指示客户端重定向到其他地址
    pub const REDIRECT: &str = "REDIRECT";
    // 请求服务器录制媒体流
    pub const RECORD: &str = "RECORD";

    // 包含所有 RTSP 方法名称常量的数组，方便遍历和使用
    pub const ARRAY: [&str; 11] = [
        OPTIONS,
        DESCRIBE,
        ANNOUNCE,
        SETUP,
        PLAY,
        PAUSE,
        TEARDOWN,
        GET_PARAMETER,
        SET_PARAMETER,
        REDIRECT,
        RECORD,
    ];
}

// 服务器会话类型枚举
pub enum ServerSessionType {
    // 拉流模式
    Pull,
    // 推流模式
    Push,
}

// 客户端会话类型枚举
pub enum ClientSessionType {
    // 拉流模式
    Pull,
    // 推流模式
    Push,
}

impl fmt::Display for ServerSessionType {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // 根据 ServerSessionType 枚举值匹配对应的字符串表示
        let client_type = match self {
            ServerSessionType::Pull => String::from("pull"),
            ServerSessionType::Push => String::from("push"),
        };
        // 将匹配到的字符串写入格式化器
        write!(f, "{client_type}")
    }
}

// 用户代理字符串常量
pub const USER_AGENT: &str = "streaming_media_server 0.25.2";
